package com.cb2.algorithm.leetcode;

import java.util.HashMap;
import java.util.Map;

/**
 * <a href='https://leetcode.cn/problems/4sum-ii'>四数相加 II(4Sum II)</a>
 * <p>给你四个整数数组 nums1、nums2、nums3 和 nums4 ，数组长度都是 n ，请你计算有多少个元组 (i, j, k, l) 能满足：
 *  <ul>
 *      <li>0 <= i, j, k, l < n</li>
 *      <li>nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0</li>
 *  </ul>
 * </p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 *  示例 1：
 *      输入：nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
 *      输出：2
 *      解释：
 *      两个元组如下：
 *      1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
 *      2. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0
 *
 *  示例 2：
 *      输入：nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
 *      输出：1
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>n == nums1.length</li>
 *      <li>n == nums2.length</li>
 *      <li>n == nums3.length</li>
 *      <li>n == nums4.length</li>
 *      <li>1 <= n <= 200</li>
 *      <li>-2^28 <= nums1[i], nums2[i], nums3[i], nums4[i] <= 2^28</li>
 * </ul>
 * </p>
 *
 * @author c2b
 * @see LC0018_4Sum_M 四数之和
 * @see LC0454_4Sum_II_M 四数相加 II
 * @since 2025/2/7 13:33
 */
public class LC0454_4Sum_II_M {
    static class Solution {
        public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
            int res = 0;
            // key：nums1、nums2中任意两个元素之和，value：两数之和出现的次数
            Map<Integer, Integer> cntMap = new HashMap<>();
            for (int n1 : nums1) {
                for (int n2 : nums2) {
                    int sum = n1 + n2;
                    cntMap.put(sum, cntMap.getOrDefault(sum, 0) + 1);
                }
            }
            for (int n3 : nums3) {
                for (int n4 : nums4) {
                    res += cntMap.getOrDefault(-n3 - n4, 0);
                }
            }
            return res;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.fourSumCount(new int[]{1, 2}, new int[]{-2, -1}, new int[]{-1, 2}, new int[]{0, 2}));
        System.out.println(solution.fourSumCount(new int[]{0}, new int[]{0}, new int[]{0}, new int[]{0}));
    }
}
